#include "main.h"
#include "menu.h"
#include "oled.h"
#include "gpio.h"


/*菜单全局属性*/
struct MenuProperty Menu_Global = {
	.Cursor_Actual_X = 0,  // 当前光标位置X
	.Cursor_Actual_Y = 63, // 当前光标位置Y
	.Cursor_Actual_W = 0,  // 当前光标尺寸宽
	.Cursor_Actual_H = 0,  // 当前光标尺寸高

	.CursorStyle = reverse,	 // 光标风格;
	.Cursor_ActSpeed = 0.15, // 光标动画速度系数;
	.Slide_ActSpeed = 2,	 // 滚动动画速度系数;

	.Font_Width = 8,	// 字体宽度 8 或 6
	.Font_Height = 16,	// 字体高度
	.Line_Height = 16,	// 行高
	.Layout_Margin = 0, // 页边距

	.Window_X = 0,	 // 窗口位置X
	.Window_Y = 0,	 // 窗口位置Y
	.Window_W = 128, // 窗口宽度
	.Window_H = 64,	 // 窗口高度
};


struct Option_Class Menu_StartOptionList[] = {
		{"<<<"},
		{"Tools"},	   // 工具
		{"Games"},	   // 游戏
		{"Setting"},  // 设置
		{"Information"}, // 信息
		{".."}};

void page1()
{
	OLED_ShowString(0,0,"你好世界             ",OLED_8X16);
	OLED_ShowString(0,16,"AD                ",OLED_8X16);
	OLED_ShowString(0,32,"fuck you!            ",OLED_8X16);
	OLED_ShowString(0,48,"MPU6050           ",OLED_8X16);

}


void Menu_RunMainMenu(void)
{
	//	static struct Option_Class Menu_StartOptionList[] = {
	//		{"<<<"},
	//		{"Tools"},	   // 工具
	//		{"Games"},	   // 游戏
	//		{"Setting"},  // 设置
	//		{"Information"}, // 信息
	//		{".."}};





	Menu_RunMenu(Menu_StartOptionList);
}


void Menu_RunMenu(struct Option_Class *Option_List)
{
	OLED_ShowString(0,0,Option_List[0].String,OLED_8X16);
	OLED_ShowString(0,16,Option_List[1].String,OLED_8X16);
	OLED_ShowString(0,32,Option_List[2].String,OLED_8X16);
	OLED_ShowString(0,48,Option_List[3].String,OLED_8X16);

}

int menuc1()
{

	static uint8_t flag = 1;
	static uint8_t _gET_into_flag  = 1;
	if(_gET_into_flag)
	{
		Menu_RunMainMenu();
		Menu_StartOptionList[0].StrLen = Menu_GetOptionStrLen(Menu_StartOptionList[0].String);
		Menu_StartOptionList[1].StrLen = Menu_GetOptionStrLen(Menu_StartOptionList[1].String);
		Menu_StartOptionList[2].StrLen = Menu_GetOptionStrLen(Menu_StartOptionList[2].String);
		Menu_StartOptionList[3].StrLen = Menu_GetOptionStrLen(Menu_StartOptionList[3].String);

		OLED_ReverseArea(0,0,Menu_StartOptionList[0].StrLen*8,16);
		_gET_into_flag = 0;
	}
	while(1)
	{
		if(READ_SWTICH())
		{
			LL_mDelay(10);
			if(READ_SWTICH())
			{
				flag++;
				if(flag>4)
				{
					flag = 1;
				}
				while(READ_SWTICH())//抬起触发
				{

				}
				switch(flag)
				{
				case 1:
				{
					Menu_RunMainMenu();

					OLED_ReverseArea(0,0,Menu_StartOptionList[0].StrLen*8,16);

					break;
				}
				case 2:
				{
					Menu_RunMainMenu();
					OLED_ReverseArea(0,16,Menu_StartOptionList[1].StrLen*8,16);

					break;
				}
				case 3:
				{
					Menu_RunMainMenu();
					OLED_ReverseArea(0,32,Menu_StartOptionList[2].StrLen*8,16);

					break;
				}
				case 4:
				{
					Menu_RunMainMenu();
					OLED_ReverseArea(0,48,Menu_StartOptionList[3].StrLen*8,16);

					break;
				}

				}
				return flag;
			}

		}



	}


}



/**
 * 函    数：计算选项字符串长度;
 * 参    数：String 计算长度的字符串
 * 返 回 值：字符串长度
 * 说    明：英文一个长度,中文两个长度;
 */
uint8_t Menu_GetOptionStrLen(char *String)
{
	uint8_t i = 0, len = 0;
	while (String[i] != '\0') // 遍历字符串的每个字符
	{
		if (String[i] > '~') // 如果不属于英文字符长度加2
		{
			len += 2;
			i += 3;
		}
		else // 属于英文字符长度加1
		{
			len += 1;
			i += 1;
		}
	}
	return len;
}

/**
 * 函    数：平滑偏移
 * 参    数：Actual_Value 当前数值
 * 参    数：Target_Value 目标数值
 * 参    数：Act_Speed 偏移速度
 * 返 回 值: 当前数值偏移后的值
 * 说    明：按照格式写入参数, 每次循环调用, 当前值都向目标值靠近一定距离
 */
float Menu_CurveMigration(float Actual_Value, float Target_Value, float Act_Speed)
{
	if ((Target_Value - Actual_Value) > 1)
	{
		Actual_Value += (Target_Value - Actual_Value) * Act_Speed + 1;
	}
	else if ((Target_Value - Actual_Value) < -1)
	{
		Actual_Value += (Target_Value - Actual_Value) * Act_Speed - 1;
	}
	else
	{
		Actual_Value = Target_Value;
	}

	return Actual_Value;
}


/**
 * 函    数：菜单平滑显示光标
 * 参    数：Target_Cur_X 光标目标X位置
 * 参    数：Target_Cur_Y 光标目标Y位置
 * 参    数：Target_Cur_W 光标目标宽度
 * 参    数：Target_Cur_H 光标目标高度
 * 参    数：Cur_Act_Speed 光标移动速度范围: 0 < Cur_Act_Speed <=1
 * 返 回 值：无
 * 说    明：输入光标目标位置和尺寸, 光标会在多次打印中逐渐接近目标位置和尺寸;
 */
void Menu_ShowCursor(float Target_Cur_X, float Target_Cur_Y, float Target_Cur_W, float Target_Cur_H, enum CursorStyle CurStyle, float Cur_Act_Speed)
{
	Menu_Global.Cursor_Actual_X = Menu_CurveMigration(Menu_Global.Cursor_Actual_X, Target_Cur_X, Cur_Act_Speed);
	Menu_Global.Cursor_Actual_Y = Menu_CurveMigration(Menu_Global.Cursor_Actual_Y, Target_Cur_Y, Cur_Act_Speed);
	Menu_Global.Cursor_Actual_W = Menu_CurveMigration(Menu_Global.Cursor_Actual_W, Target_Cur_W, Cur_Act_Speed);
	Menu_Global.Cursor_Actual_H = Menu_CurveMigration(Menu_Global.Cursor_Actual_H, Target_Cur_H, Cur_Act_Speed);

	if (CurStyle == reverse)
	{
		OLED_ReverseArea(Menu_Global.Cursor_Actual_X, Menu_Global.Cursor_Actual_Y, Menu_Global.Cursor_Actual_W, Menu_Global.Cursor_Actual_H); // 反相光标
	}
	else if (CurStyle == mouse)
	{
		OLED_ShowString(Menu_Global.Cursor_Actual_X + Menu_Global.Cursor_Actual_W, Menu_Global.Cursor_Actual_Y + (Menu_Global.Cursor_Actual_H - 6) / 2, "<-", OLED_6X8); // 尾巴光标
	}
	else if (CurStyle == frame)
	{
		OLED_DrawRectangle(Menu_Global.Cursor_Actual_X, Menu_Global.Cursor_Actual_Y, Menu_Global.Cursor_Actual_W, Menu_Global.Cursor_Actual_H, 0); // 矩形光标
	}
}
